unit Impresores;

{$mode objfpc}{$H+}

interface

uses
  SysUtils;
  
const
  fs = chr(28);

Type TImpresorFiscal = class
  public
    function cierre_fiscal(tipo : char) : string;
    function poner_encabezado(nombre: string; cuit : string; iva: string; direccion : string) : string;
    function abrir_comprobante(tipo : char) : string;
    function referencia_venta(codigo : string) : string;
    function agregar_item
      (producto : string; cantidad : real; punitario : real; iva : real; impint : real) :string;
    function descuento_recargo(tipo : string; valor : string) : string;
    function subtotal() : string;
    function total(forma_pago : string; valor : string) : string;
    function cerrar_comprobante() : string;
    function factabre(nombre: string; cuit : string; iva: string; direccion : string) : string;
    function tiqueabre() : string;
    function tiquetexto(codigo : string) : string;
    function factitem
      (producto : string; cantidad : real; punitario : real; iva : real; impint : real) :string;
    function tiqueitem
      (producto : string; cantidad : real; punitario : real; iva : real; impint : real) :string;
    function factpago(tipo : string; valor : string; texto : string) : string;
    function tiquepago(tipo : string; valor : string; texto : string) : string;
    function factcierra(iva : string) : string;
    function tiquecierra() : string;
    function poner_nro_factura(nro_factura : string) : string;
    function abrir_dnfh(tipo : string) : string;
    function cerrar_dnfh() : string;
    function reporte_iva(iva_desde : string; iva_hasta: string) : string;
end;

implementation

uses
  Unit1;


function TIMpresorFiscal.reporte_iva(iva_desde : string; iva_hasta : string) : string;
var
  comando : string;

begin
  if (registro.tipo_impresor = 'Hasar PL8F')
  or (registro.tipo_impresor = 'Hasar P715F')
  or (registro.tipo_impresor = 'Hasar PR4F') then
    comando := chr(58) + fs + iva_desde + fs + iva_hasta + fs + 'D'
  else
    comando := '';

  reporte_iva := comando;
end;

function TImpresorFiscal.tiquecierra() : string;
var
  comando : string;
  
begin
  comando := '@TIQUECIERRA|T|';
  tiquecierra := comando;
end;
  
function TImpresorFiscal.factcierra(iva : string) : string;
var
  comando : string;
  tipofactura : string;
  
begin
  if iva = 'I' then
    tipofactura := 'A'
  else
    tipofactura := 'B';
    
  comando := '@FACTCIERRA|T|' + tipofactura + '|';
  factcierra := comando;
end;

function TImpresorFiscal.tiquepago(tipo : string; valor : string; texto : string) : string;
var
  comando : string;

begin
  if StrToFloat(valor) < 0 then
    valor := FloatToStr(0 - StrToFloat(valor));
    
  comando := '@TIQUEPAGO|' + FormatFloat('###0.00', StrToFloat(valor)) + '|' + texto + '|' + tipo + '|';
  tiquepago := comando;
end;

function TImpresorFiscal.factpago(tipo : string; valor : string; texto : string) : string;
var
  comando : string;

begin
  if StrToFloat(valor) < 0 then
    valor := FloatToStr(0 - StrToFloat(valor));
  
  comando := '@FACTPAGO|' + FormatFloat('###0.00', StrToFloat(valor)) + '|' + texto + '|' + tipo + '|';
  factpago := comando;
end;

function TImpresorFiscal.tiqueitem
  (producto : string; cantidad : real; punitario : real; iva : real; impint : real) : string;
var
  comando : string;
  ivastr : string;

begin
  iva := iva / 100;
  ivastr := FormatFloat('###0.0000', iva);

  comando := '@TIQUEITEM|' + producto + '|' + FormatFloat('###0.000', cantidad) + '|'
    + FormatFloat('###0.00', punitario) + '|' + ivastr + '|M|1|0|' + FormatFloat('###0.00', impint)
    + '|';

  tiqueitem := comando;
end;

function TImpresorFiscal.factitem
  (producto : string; cantidad : real; punitario : real; iva : real; impint : real) : string;
var
  comando : string;
  pospto : longint;
  ivastr : string;
  
begin
  punitario := punitario - (iva * punitario / 100);
  
  ivastr := FloatToStr(iva);
  pospto := pos('.', ivastr);
  delete(ivastr, pospto, 1);
  
  comando := '@FACTITEM|' + producto + '|' + FormatFloat('###0.000', cantidad) + '|'
    + FormatFloat('###0.00', punitario) + '|0.' + ivastr + '|M|1|0.0||||0.0|'
    + FormatFloat('###0.00', impint);
    
  factitem := comando;
end;

function TImpresorFiscal.tiquetexto(codigo : string) : string;
var
  comando : string;

begin
  comando := '@TIQUETEXTO|ref. codigo ' + codigo;
  tiquetexto := comando;
end;
  
function TImpresorFiscal.tiqueabre() : string;
var
  comando : string;
  
begin
  comando := '@TIQUEABRE|C|';
  tiqueabre := comando;
end;

function TImpresorFiscal.factabre(nombre: string; cuit : string; iva: string; direccion : string)
  : string;
var
  comando : string;
  tipofactura : string;

begin
  if iva = 'I' then
    tipofactura := 'A'
  else
    tipofactura := 'B';
    
  comando := '@FACTABRE|T|C|' + tipofactura + '|1|F|17|I|' + iva + '|' + nombre + '||CUIT|'
    + cuit + '|B|' + direccion + '|||||C';
    
  factabre := comando;
end;

function TImpresorFiscal.cierre_fiscal(tipo : char) : String;
var
  comando : string;

begin
  if (registro.tipo_impresor = 'Hasar PL8F')
  or (registro.tipo_impresor = 'Hasar P715F')
  or (registro.tipo_impresor = 'Hasar PR4F') then
    comando := '9' + fs + tipo
  else
  if registro.tipo_impresor = 'Epson TM2000' then
  begin
    if tipo = 'Z' then
      comando := '@CIERREZ'
    else
    if tipo = 'X' then
      comando := '@CIERREX';
  end;

  cierre_fiscal := comando;
end;

function TImpresorFiscal.poner_encabezado
  (nombre: string; cuit : string; iva: string; direccion : string) : string;
var
  comando : string;
  
begin
  if registro.tipo_impresor = 'Hasar PR4F' then
    comando := 'b' + fs + nombre + fs + cuit + fs + iva + fs + 'C'
  else
    comando := 'b' + fs + nombre + fs + cuit + fs + iva + fs + 'C' + fs + direccion;
  poner_encabezado := comando;
end;

function TImpresorFiscal.abrir_comprobante(tipo : char) : string;
var
  comando : string;
  
begin
  comando := '@' + fs + tipo + fs + 'T';
  abrir_comprobante := comando;
end;

function TImpresorFiscal.referencia_venta(codigo : string) : string;
var
  comando : string;
  
begin
  comando := 'A' + fs + 'ref. codigo ' + codigo + fs + '0';
  referencia_venta := comando;
end;

function TImpresorFiscal.agregar_item
  (producto : string; cantidad : real; punitario : real; iva : real; impint : real) :string;
var
  comando : string;

begin
  if impint > 0 then
  begin
    impint := impint / 100;
    impint := 1 /(1 + impint);
  end;
  comando := 'B' + fs + producto + fs + FormatFloat('###0.00', cantidad) + fs
    + FormatFloat('###0.00', punitario) + fs + FormatFloat('###0.0', iva) + fs
    + 'M' + fs + '+' + FormatFloat('###0.000',impint) + fs + '0' + fs + 'T';
    
  agregar_item := comando;
end;

function TImpresorFiscal.descuento_recargo(tipo: string; valor : string) : string;
var
  comando : string;
  
begin
  if tipo = 'recargo' then
    comando := chr(84) + fs + 'Recargo ' + fs + FormatFloat('###0.00', StrToFloat(valor)) + fs
      + 'M' + fs + '0' + fs + 'T'
  else
  begin
    valor := FloatToStr(0 - StrToFloat(valor));
    comando := chr(84) + fs + 'Descuento ' + fs + FormatFloat('###0.00', StrToFloat(valor)) + fs
      + 'm' + fs + '0' + fs + 'T';
  end;
  descuento_recargo := comando;
end;

function TImpresorFiscal.subtotal() : string;
var
  comando : string;
  
begin
  comando := 'C' + fs + 'P' + fs + 'Subtotal' + fs + '0';
  subtotal := comando;
end;

function TImpresorFiscal.total(forma_pago : string; valor : string) : string;
var
  comando : string;
  
begin
  comando := 'D' + fs + forma_pago + fs + valor + fs + 'T' + fs + '0';
  total := comando;
end;

function TImpresorFiscal.cerrar_comprobante() : string;
var
  comando : string;
begin
  comando := 'E';
  cerrar_comprobante := comando;
end;

function TImpresorFiscal.poner_nro_factura(nro_factura : string) : string;
var
  comando : string;
  
begin
  comando := chr(147) + fs + '1' + fs + nro_factura;
  poner_nro_factura := comando;
end;

function TImpresorFiscal.abrir_dnfh(tipo : string) : string;
var
  comando : string;
  
begin
  comando := chr(128) + fs + tipo + fs + 'T';
  abrir_dnfh := comando;
end;

function TImpresorFiscal.cerrar_dnfh() : string;
begin
  cerrar_dnfh := chr(129);
end;

end.
